export default class CancelRequest {
  constructor() {
    this.pendingMap = new Map();
  }

  /**
   * 生成每个请求唯一的键
   * @param {*} config
   * @returns string
   */
  getPendingKey(config) {
    let { url, method, params, data } = config;
    if (typeof data === 'string') data = JSON.parse(data);
    return [url, method, JSON.stringify(params), JSON.stringify(data)].join('&');
  }

  /**
   * 储存每个请求唯一值, 也就是cancel()方法, 用于取消请求
   * @param {*} config
   */
  addPending(config, cancelToken) {
    const pendingKey = this.getPendingKey(config);
    config.cancelToken =
      config.cancelToken ||
      new cancelToken(cancel => {
        if (!this.pendingMap.has(pendingKey)) {
          this.pendingMap.set(pendingKey, cancel);
        }
      });
  }

  /**
   * 删除重复的请求
   * @param {*} config
   */
  removePending(config) {
    const pendingKey = this.getPendingKey(config);
    if (this.pendingMap.has(pendingKey)) {
      const cancelToken = this.pendingMap.get(pendingKey);
      cancelToken(pendingKey);
      this.pendingMap.delete(pendingKey);
    }
  }
}
